﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.Drawing;
using System.Data.Linq;
using System.Drawing.Imaging;
using System.Reflection;
using System.Windows.Forms;
using System.IO;
using Aspose.Words;
using Aspose.Words.Drawing;
namespace Aspose_word
{
    /// <summary>
    /// Thao tác với văn bản bằng thư viện Aspose.Word
    /// + Tạo file, sửa file
    /// + Mở file, In file
    /// + Up nội dung file lên CSDL
    /// </summary>
    class NCKH_aspose
    {
        DB.LinqToSqlDataContext _db = new DB.LinqToSqlDataContext();
        NCKH_aspose.ChuyenDoi tmp = new NCKH_aspose.ChuyenDoi();
        public NCKH_aspose()
        {
        }
        // Tạo file mới
        /// <summary>
        /// Tạo mới 1 file văn bản
        /// </summary>
        /// <param name="duongDan"> Đường dẫn lưu file. Chú ý: phải có cả phần mở rộng, vd: file.doc, file.pdf,... </param>
        /// <param name="mkMoFile"> Mật khẩu để mở file </param>
        /// <param name="mkSuaFile"> Mật khẩu để chỉnh sửa file </param>
        /// <param name="noiDung"> Nội dung file (lấy từ: DevExpress.XtraRichEdit.RichEditControl) </param>
        public void TaoFileMoi(string duongDan, string mkMoFile, string mkSuaFile, DevExpress.XtraRichEdit.RichEditControl noiDung)
        {
            //khởi tạo
            Document vbMoi = new Document();
            MemoryStream stream = new MemoryStream();
            //Nạp nội dung
            noiDung.SaveDocument(stream, new DevExpress.XtraRichEdit.DocumentFormat(10));
            vbMoi = new Document(stream);
            vbMoi.WriteProtection.SetPassword(mkMoFile);
            vbMoi.Protect(ProtectionType.ReadOnly, mkSuaFile);
            //Xuất file
            vbMoi.Save(duongDan);
        }
        /// <summary>
        /// Tạo mới 1 file văn bản
        /// </summary>
        /// <param name="duongDan"> Đường dẫn lưu file. Chú ý: phải có cả phần mở rộng, vd: file.doc, file.pdf,... </param>
        /// <param name="mkMoFile"> Mật khẩu để mở file </param>
        /// <param name="noiDung"> Nội dung file (lấy từ: DevExpress.XtraRichEdit.RichEditControl) </param>
        public void TaoFileMoi(string duongDan, string mkMoFile, DevExpress.XtraRichEdit.RichEditControl noiDung)
        {
            //khởi tạo
            Document vbMoi = new Document();
            MemoryStream stream = new MemoryStream();
            //Nạp nội dung
            noiDung.SaveDocument(stream, new DevExpress.XtraRichEdit.DocumentFormat(10));
            vbMoi = new Document(stream);
            vbMoi.WriteProtection.SetPassword(mkMoFile);
            //Xuất file
            vbMoi.Save(duongDan);
        }
        /// <summary>
        /// Tạo mới 1 file văn bản
        /// </summary>
        /// <param name="duongDan"> Đường dẫn lưu file. Chú ý: phải có cả phần mở rộng, vd: file.doc, file.pdf,... </param>
        /// <param name="noiDung"> Nội dung file (lấy từ: DevExpress.XtraRichEdit.RichEditControl) </param>
        public void TaoFileMoi(string duongDan, DevExpress.XtraRichEdit.RichEditControl noiDung)
        {
            //khởi tạo
            Document vbMoi = new Document();
            MemoryStream stream = new MemoryStream();
            //Nạp nội dung
            noiDung.SaveDocument(stream, new DevExpress.XtraRichEdit.DocumentFormat(10));
            vbMoi = new Document(stream);
            //Xuất file
            vbMoi.Save(duongDan);
        }
        /// <summary>
        /// Tạo mới 1 file văn bản
        /// </summary>
        /// <param name="duongDan"> Đường dẫn lưu file. Chú ý: phải có cả phần mở rộng, vd: file.doc, file.pdf,... </param>
        /// <param name="mkMoFile"> Mật khẩu để mở file </param>
        /// <param name="mkSuaFile"> Mật khẩu để chỉnh sửa file </param>
        /// <param name="noiDung"> Nội dung file </param>
        public void TaoFileMoi(string duongDan, string mkMoFile, string mkSuaFile, string noiDung)
        {
            //khởi tạo
            Document vbMoi = new Document();
            DocumentBuilder vanBan = new DocumentBuilder(vbMoi);
            //Nạp nội dung
            vanBan.Write(noiDung);
            vbMoi.WriteProtection.SetPassword(mkMoFile);
            vbMoi.Protect(ProtectionType.ReadOnly, mkSuaFile);
            //Xuất file
            vbMoi.Save(duongDan);
        }
        /// <summary>
        /// Tạo mới 1 file văn bản
        /// </summary>
        /// <param name="duongDan"> Đường dẫn lưu file. Chú ý: phải có cả phần mở rộng, vd: file.doc, file.pdf,... </param>
        /// <param name="mkMoFile"> Mật khẩu để mở file </param>
        /// <param name="noiDung"> Nội dung file </param>
        public void TaoFileMoi(string duongDan, string mkMoFile, string noiDung)
        {
            //khởi tạo
            Document vbMoi = new Document();
            DocumentBuilder vanBan = new DocumentBuilder(vbMoi);
            //Nạp nội dung
            vanBan.Write(noiDung);
            vbMoi.WriteProtection.SetPassword(mkMoFile);
            //Xuất file
            vbMoi.Save(duongDan);
        }
        /// <summary>
        /// Tạo mới 1 file văn bản
        /// </summary>
        /// <param name="duongDan"> Đường dẫn lưu file. Chú ý: phải có cả phần mở rộng, vd: file.doc, file.pdf,... </param>
        /// <param name="noiDung"> Nội dung file </param>
        public void TaoFileMoi(string duongDan, string noiDung)
        {
            //khởi tạo
            Document vbMoi = new Document();
            DocumentBuilder vanBan = new DocumentBuilder(vbMoi);
            //Nạp nội dung
            vanBan.Write(noiDung);
            //Xuất file
            vbMoi.Save(duongDan);
        }

        //Mở file
        /// <summary>
        /// Mở 1 file xuất ra DevExpress.XtraRichEdit.RichEditControl
        /// </summary>
        /// <param name="duongDan"> Đường dẫn file cần mở </param>
        /// <param name="mkMoFile"> Mật khẩu để mở file </param>
        /// <param name="noiDung"> RichEdit mà muốn nạp nội dung vào </param>
        public void MoFileRaRichEdit(string duongDan, string mkMoFile, DevExpress.XtraRichEdit.RichEditControl noiDung)
        {
            Document vanBan = new Document(duongDan, new LoadOptions(mkMoFile));
            MemoryStream stream = new MemoryStream();
            vanBan.Save(stream, SaveFormat.Doc);
            noiDung.LoadDocument(tmp.DocumentToStream(vanBan), new DevExpress.XtraRichEdit.DocumentFormat(10));
        }
        /// <summary>
        /// Mở 1 file xuất ra DevExpress.XtraRichEdit.RichEditControl
        /// </summary>
        /// <param name="duongDan"> Đường dẫn file cần mở </param>
        /// <param name="noiDung"> RichEdit muốn náp nội dung vào </param>        
        public void MoFileRaRichEdit(string duongDan, DevExpress.XtraRichEdit.RichEditControl noiDung)
        {
            Document vanBan = new Document(duongDan);
            MemoryStream stream = new MemoryStream();
            vanBan.Save(stream, SaveFormat.Doc);
            noiDung.LoadDocument(tmp.DocumentToStream(vanBan), new DevExpress.XtraRichEdit.DocumentFormat(10));
        }
        /// <summary>
        /// Lấy nội dung file trả về dạng string
        /// </summary>
        /// <param name="duongDan"> Đường dẫn file cần mở </param>
        /// <param name="mkMoFile"> Mật khẩu để mở file </param>
        /// <returns> Lấy nội dung file trả về dạng string </returns>
        public string MoFileRaString(string duongDan, string mkMoFile)
        {
            string noiDung = "";
            Document vanBan = new Document(duongDan, new LoadOptions(mkMoFile));
            noiDung = vanBan.Document.ToString(SaveFormat.Text);
            return noiDung;
        }
        /// <summary>
        /// Lấy nội dung file trả về dạng string
        /// </summary>
        /// <param name="duongDan"> Đường dẫn file cần mở </param>
        /// <returns> Lấy nội dung file trả về dạng string </returns>
        public string MoFileRaString(string duongDan)
        {
            string noiDung = "";
            Document vanBan = new Document(duongDan);
            noiDung = vanBan.Document.ToString(SaveFormat.Text);
            return noiDung;
        }
        /// <summary>
        /// Thiết lập cài đặt máy in
        /// </summary>
        /// <returns></returns>
        public System.Drawing.Printing.PrinterSettings prtSetting()
        {
            System.Drawing.Printing.PrinterSettings prtsetting = new System.Drawing.Printing.PrinterSettings();
            PrintDialog prtDialog = new PrintDialog();
            if (prtDialog.ShowDialog() == DialogResult.OK)
            {
                prtsetting.PrinterName = prtDialog.PrinterSettings.PrinterName;
                prtsetting.PrintRange = prtDialog.PrinterSettings.PrintRange;
            }
            else
            {
                prtsetting.PrinterName = "KhongIn";
            }
            return prtsetting;
        }
        /// <summary>
        /// In Văn bản
        /// </summary>
        /// <param name="vanBan"> Document cần in </param>
        public void InVanBan(Document vanBan)
        {
            System.Drawing.Printing.PrinterSettings settingPrint = prtSetting();
            if(settingPrint.PrinterName != "KhongIn")
                vanBan.Print(settingPrint, "Document print by xxxx");
        }
        /// <summary>
        /// In văn bản
        /// </summary>
        /// <param name="duongDan"> Đường dẫn file cần in </param>
        public void InVanBan(string duongDan)
        {
            Document vanBan = new Document(duongDan);
            System.Drawing.Printing.PrinterSettings settingPrint = prtSetting();
            if (settingPrint.PrinterName != "KhongIn")
                vanBan.Print(settingPrint, "Document print by xxxx");
        }

        //Chuyển đổi giữa các kiểu DL
        /// <summary>
        /// Chuyển đổi giữa Document, RichEdit, Stream
        /// </summary>
        public class ChuyenDoi
        {
            public ChuyenDoi()
            {
            }
            /// <summary>
            /// Chuyển đổi Document sang kiểu Stream
            /// </summary>
            /// <param name="vanBan"> Biến kiểu Document </param>
            /// <returns> Stream chưa document </returns>
            public MemoryStream DocumentToStream(Document vanBan)
            {
                MemoryStream stream = new MemoryStream();
                vanBan.Save(stream, SaveFormat.Doc);
                return stream;
            }

            /// <summary>
            /// Chuyển đổi MemoryStream sang Document
            /// </summary>
            /// <param name="stream"> Biến kiểu MemoryStream </param>
            /// <returns> kiểu Document </returns>
            public Document StreamToDocument(MemoryStream stream)
            {
                Document doc = new Document(stream);
                return doc;
            }

            /// <summary>
            /// Chuyển đổi RichEdit sang MemoryStream
            /// </summary>
            /// <param name="rich"> Một đối tượng DevExpress.XtraRichEdit.RichEditControl </param>
            /// <returns> Stream </returns>
            public MemoryStream RichToStream(DevExpress.XtraRichEdit.RichEditControl rich)
            {
                MemoryStream stream = new MemoryStream();
                rich.SaveDocument(stream, new DevExpress.XtraRichEdit.DocumentFormat(10));
                return stream;
            }

            /// <summary>
            /// Nạp kiểu MemoryStream vào trong RichEdit
            /// </summary>
            /// <param name="stream"> Biến kiểu MemoryStream </param>
            /// <returns></returns>
            public DevExpress.XtraRichEdit.RichEditControl StreamToRich(MemoryStream stream)
            {
                DevExpress.XtraRichEdit.RichEditControl rich = new DevExpress.XtraRichEdit.RichEditControl();
                rich.LoadDocument(stream, new DevExpress.XtraRichEdit.DocumentFormat(10));
                return rich;
            }

            /// <summary>
            /// Xuất RichEdit ra một Document
            /// </summary>
            /// <param name="rich"></param>
            /// <returns></returns>
            public Document RichToDocument(DevExpress.XtraRichEdit.RichEditControl rich)
            {
                Document vanBan = new Document(RichToStream(rich));
                return vanBan;
            }

            /// <summary>
            /// Nạp vào RichEdit một Document
            /// </summary>
            /// <param name="vanBan"></param>
            /// <returns></returns>
            public DevExpress.XtraRichEdit.RichEditControl DocumentToRich(Document vanBan)
            {
                DevExpress.XtraRichEdit.RichEditControl rich = new DevExpress.XtraRichEdit.RichEditControl();
                rich.LoadDocument(DocumentToStream(vanBan), new DevExpress.XtraRichEdit.DocumentFormat(10));
                return rich;
            }

            /// <summary>
            /// * Chuyển 1 ảnh vào trong file PDF
            ///     using System.Drawing;
            ///     using System.Drawing.Imaging;
            ///     using System.IO;
            ///     using System.Reflection;
            /// </summary>
            /// <param name="inputFileName"> Đường dẫn file ảnh đầu vào (JPEG, PNG, BMP, EMF, WMF, IF, GIF) </param>
            /// <param name="outputFileName"> Đường dẫn xuất file ra </param>
            public void ConvertImageToPdf(string inputFileName, string outputFileName)
            {
                // Tạo Document và DocumentBuilder.
                Document doc = new Document();
                DocumentBuilder builder = new DocumentBuilder(doc);

                // Đọc ảnh từ file, ensure it is disposed.
                using (Image image = Image.FromFile(inputFileName))
                {
                    // Find which dimension the frames in this image represent. For example 
                    // the frames of a BMP or TIFF are "page dimension" whereas frames of a GIF image are "time dimension". 
                    FrameDimension dimension = new FrameDimension(image.FrameDimensionsList[0]);

                    // Lấy số khung (frames) trong hình
                    int framesCount = image.GetFrameCount(dimension);

                    // Lặp qua tất cả các frames
                    for (int frameIdx = 0; frameIdx < framesCount; frameIdx++)
                    {
                        // Ngắt trang
                        if (frameIdx != 0)
                            builder.InsertBreak(BreakType.SectionBreakNewPage);

                        // Chọn frame hoạt động
                        image.SelectActiveFrame(dimension, frameIdx);

                        // Chỉnh sửa kích thước hình ảnh
                        PageSetup ps = builder.PageSetup;
                        ps.PageWidth = ConvertUtil.PixelToPoint(image.Width, image.HorizontalResolution);
                        ps.PageHeight = ConvertUtil.PixelToPoint(image.Height, image.VerticalResolution);

                        // Chèn ảnh vào document tại vị trí góc trên-trái
                        builder.InsertImage(
                            image,
                            RelativeHorizontalPosition.Page,
                            0,
                            RelativeVerticalPosition.Page,
                            0,
                            ps.PageWidth,
                            ps.PageHeight,
                            WrapType.None);
                    }
                }
                // Lưu file PDF
                doc.Save(outputFileName);
            }
        }

        //Chưa xong
        private void UpVanBanLenCSDL(string duongDan)
        {
            Document doc = new Document(duongDan);
            DB.VanBan duLieu = new DB.VanBan();
            duLieu.DuLieu = tmp.DocumentToStream(doc).ToArray();
            _db.VanBans.InsertOnSubmit(duLieu);
            _db.SubmitChanges();
            //MessageBox.Show("OK");
        }
        private void UpVanBanLenCSDL(Document vanBan)
        {
            Document doc = vanBan;
            DB.VanBan duLieu = new DB.VanBan();
            duLieu.DuLieu = tmp.DocumentToStream(doc).ToArray();
            _db.VanBans.InsertOnSubmit(duLieu);
            _db.SubmitChanges();
            //MessageBox.Show("OK");
        }
        private void LayVanBanTUuCSDLVe()
        {
            DB.LinqToSqlDataContext db = new DB.LinqToSqlDataContext();
            var duLieu = (from dl in db.VanBans
                          select dl.DuLieu.ToArray()
                         ).SingleOrDefault();

            byte[] b = duLieu;
            MemoryStream stream = new MemoryStream(b);
            Document doc = new Document(stream);
            //richEditControl1.LoadDocument(stream, new DevExpress.XtraRichEdit.DocumentFormat(10));
        }
        private MemoryStream CSDLtoStream(string key)
        {
            DB.LinqToSqlDataContext db = new DB.LinqToSqlDataContext();
            var vanBanMoi = (from vb in db.tbVanBans
                             where vb.maVb == key
                             select vb.DuLieu.ToArray()).SingleOrDefault();

            byte[] b = vanBanMoi;
            MemoryStream stream = new MemoryStream(b);
            Document doc = new Document(stream);
            return stream;
        }
    }
}
